﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Sireass.Bl.Rules
{
	/// <summary>
	/// Clase que permite validar que un periodo esté expresado correctamente, asegurándose que la fecha de fin del periodo 
	/// sea mayor o igual a la fecha de inicio.
	/// </summary>
	class ValidaPeriodo : Csla.Rules.BusinessRule { 
		/// <summary>
		/// Fecha de fin del periodo.
		/// </summary>
		public Csla.Core.IPropertyInfo FechaFin { get; set; }
		/// <summary>
		/// Constructor que recibe como parámetros la fecha de inicio y la fecha de fin del periodo que se va a validar.
		/// </summary>
		/// <param name="fechaInicio">Fecha en la que inicia el periodo</param>
		/// <param name="fechaFin">Fecha en la que termina el periodo</param>
		public ValidaPeriodo(Csla.Core.IPropertyInfo fechaInicio, Csla.Core.IPropertyInfo fechaFin) : base(fechaInicio) 
		{
			FechaFin = fechaFin;
			InputProperties = new List<Csla.Core.IPropertyInfo> { PrimaryProperty, FechaFin };
		}
		/// <summary>
		/// Valida que la fecha de fin sea mayor o igual a la fecha de inicio, en caso contrario se genera el error.
		/// Si las fechas de inicio y/o fin son nulas, se omite la validación.  El supuesto es que deben existir ambas
		/// fechas para ejecutar la validación.
		/// </summary>
		/// <param name="context">Contiene la información necesaria para ejecutar la validación</param>
		protected override void Execute(Csla.Rules.RuleContext context) 
		{ 
			//var text = (string)context.InputPropertyValues[PrimaryProperty]; 
			//if (!string.IsNullOrEmpty(text) && !text.StartsWith(Prefix)) 
			//    context.AddErrorResult(string.Format("Value must start with {0}", Prefix)); 
			var fechaInicioVigencia = Convert.ToDateTime(context.InputPropertyValues[PrimaryProperty]);
			var fechaFinVigencia = Convert.ToDateTime(context.InputPropertyValues[FechaFin]);
			if (fechaInicioVigencia != null && fechaFinVigencia != null && fechaFinVigencia.CompareTo(fechaInicioVigencia) < 0)
			{
				context.AddErrorResult("La Fecha de Fin de Vigencia debe ser mayor o igual a la Fecha de Inicio de Vigencia");
			}
		}
	}
}
